package com.yangfan.juc.utils;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * @description: 信号量，类似于 一个厕所 5个坑位 一下来了 10个人。
 *      最多 5个人同时蹲坑  5个许可。 拉完一个 走一个释放许可 在进来一个 。
 *
 *  acquire() 申请许可证
 *  release() 释放许可证
 *
 * @author: yangfan
 * @date: Created in 2020/3/25 0025 16:46
 * @modified By:
 */
public class SemaphoreExample1 {

    private static final ExecutorService exec = Executors.newFixedThreadPool(5);

    public static void main(String[] args) {

        SemaphoreLock lock = new SemaphoreLock();

        for(int i=0;i<3;i++){
            Work w = new Work(lock);
            exec.submit(w);
        }
        exec.shutdown();
    }


    static class Work implements Runnable{

        private SemaphoreLock lock;

        Work(SemaphoreLock lock){
            this.lock = lock;
        }

        @Override
        public void run() {

            try {
                System.out.println(Thread.currentThread().getName() + "要进行争抢锁！");
                lock.lock();
                System.out.println(Thread.currentThread().getName() + "抢到锁了！");
                TimeUnit.SECONDS.sleep(5);//等待5秒
                System.out.println(Thread.currentThread().getName() + "执行完毕了！");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                lock.unlock();
            }

        }

    }


    /**
     * 自定义一个锁,每次 只能有一个线程进行执行 其他线程只能在等待
     *      可以设置 多个 信号
     */
    static class SemaphoreLock{

        Semaphore lock = new Semaphore(1);//初始化有多少个信号

        void lock() throws InterruptedException {
            lock.acquire();
        }

        void unlock(){
            lock.release();
        }

    }


}
